<?php
/**
 * 设置时区
 */
date_default_timezone_set("PRC"); 

//判断是否POST提交
define('IS_POST', (strtoupper($_SERVER['REQUEST_METHOD']) == 'POST'));

/**
 * 初始化网站，初始化网站仅初始化网站的基础变量，不作任何的逻辑处理
 */
function init_site(){
	//加载配置
	load_config();
	
	//初始化Session
	_session_start();
	
	//初始化自动加载器
	init_auto_loader();
	
	//初始化客户端信息
	init_agent();
	
	//初始化域名
	if(!init_domain()){
		//域名不存在
		header('Location: 404.html');
		exit;
	}
	
	//尝试获取页面缓存
	try_get_cache();

	//初始化当前语言
	init_language();
	
	//初始化详细的site_info并放入缓存
//	init_site_info();
	
	//初始化Controller / Action
	init_controller_action();
}

function try_get_cache(){
	$cache = get_cache_service();
	$key = $cache->gen_cache_key(MAIN_DOMAIN, REDIRECT_URL);
	$content = $cache->get($key);
	if(!empty($content)){
		echo $content;
		exit;
	}
}

function in_black_list(){
	//判断访问者IP是否在黑名单内
	
}

function load_config(){
	$site_config = include ROOT_PATH . '/protected/config/config.inc.php';
	foreach ($site_config as $key=>$value){
		define(strtoupper($key), $value);
	}
}

/**
 * 初始化客户端类型
 */
function init_agent(){
	$angen = get_agent_type();
	define('AGENT', $angen);
}

/**
 * 获取当前的Controller
 * 初始化Controller时，会尝试加载三个文件：
 * 1. 页面模块基类
 * 2. 原生APP
 * 3. 私有APP
 */
function &c($web_model='front'){
	global $controller;
	if($controller == null){
		//网页模块
		define('WEB_MODULE', $web_model);
		$controller_name = ucfirst(APP) . 'Controller';
		
		//加载基本类
		require_once ROOT_PATH . '/protected/web/' . WEB_MODULE . '/app/' . ucfirst(WEB_MODULE) . 'Controller.php';
		
		//加载原生APP
		$controller_file = ROOT_PATH . '/protected/web/' . WEB_MODULE . '/app/' . $controller_name . '.php';
		if(is_file($controller_file)){
			require_once $controller_file;
		}
		
		//私有扩展APP
		$self_controller_name = ucfirst(APP) . 'SelfController';
		$self_controller_file = USER_TEMPLATE_PATH . 'app/' . WEB_MODULE . '/' . $self_controller_name . '.php';
		if(is_file($self_controller_file)){
			//如果私有扩展APP存在
			require_once $self_controller_file;
			$controller = new $self_controller_name;
		}else{
			$controller = new $controller_name;
		}
	}
	return $controller;
}

/**
 * 初始化类自动加载器
 */
function init_auto_loader(){
	$include_paths = array(
        ROOT_PATH . '/protected/includes/models',	//Models
        ROOT_PATH . '/protected/core',	//核心模块
        ROOT_PATH . '/protected/includes/forms/attrs',	//属性模块
    );
	set_include_path(get_include_path() . PATH_SEPARATOR . implode(PATH_SEPARATOR, $include_paths));
	spl_autoload_register('class_auto_load');
}

/**
 * 初始化域名，在初始化域名的时候，会加载网站的基本信息
 */
function init_domain(){
	global $site_info;
	//获取当前请求域名，如果是使用IP访问的，也将IP当成域名处理
	$domain = $_SERVER['SERVER_NAME'];
	define('DOMAIN', $domain);
	
	define('REQUEST_URI', $_SERVER['REQUEST_URI']);
	
	if(isset($_SERVER['REDIRECT_URL'])){
    	$url = $_SERVER['REDIRECT_URL'];
    }else{
		$url = REQUEST_URI;
    }
    
    //当前的请求路径 ，比如：/ /index.html /index.php?app=site等
	define('REDIRECT_URL', $url);
	
	//尝试获取Site_id
	$cache = get_cache_service();
	$site_cache_key = $domain . '_' . CACHE_KEY;
	$site_info = $cache->get($site_cache_key);
	if(YU_DEBUG || $site_info == null){
		//如果不存在，则初始化
		$site_mod = new SiteModel();
		$site_info = $site_mod->get_by_domain($domain);
		
		if(empty($site_info))
			return false;
		
		$main_domain = $site_info['domains'][0];
// 		foreach($site_info['domains'] as $domain_info){
// 			if(isset($domain_info['main']) && $domain_info['main']){
// 				$main_domain = $domain_info['domain'];
// 			}
// 		}
// 		if(!isset($main_domain)){
// 			//如果没有指定，则使用第一个域名作为主域名
// 			$main_domain = $site_info['domains'][0]['domain'];
// 		}
		$site_id = $site_info['_id'];
		$site_info['main_domain'] = $main_domain;
		$cache->set($site_cache_key, $site_info);
	}else{
		$site_id = $site_info['site_id'];
		$main_domain = $site_info['main_domain'];
	}
	define('SITE_ID', $site_id);
	define('MAIN_DOMAIN', $main_domain);
	
	//设置用户模板路径 
	define('USER_TEMPLATE_PATH', ROOT_PATH . '/sites/main/' . MAIN_DOMAIN . '/template/');
	return true;
}

/**
 * 初始化语言
 */
function init_language(){
	$language = null;
	
	//从Request中取
	if(isset($_REQUEST['_lang'])){
		//从请求中获取语言包
		$temp_lang = trim($_REQUEST['_lang']);
		if(Lang::is_lang($temp_lang)){
			$language = $temp_lang; 
			//设置进Session
			set_session('LANG', $language);
		}
	}
	
	//从Session中取
	if($language == null){
		$temp_lang = get_session('LANG');
		if(Lang::is_lang($temp_lang)){
			$language = $temp_lang; 
		}
	}
	
	//从Cookies中取
	if($language == null && isset($_COOKIE['LANG'])){
		$temp_lang = $_COOKIE['LANG'];
		if(Lang::is_lang($temp_lang)){
			$language = $temp_lang; 
		}
	}
	
	//设置默认语言
	if($language == null){
		$language = 'zh_cn';
	}
	
	define('LANGUAGE', $language);
	
	//初始化网站多语言
	global $site_info;
	if(!isset($site_info['langs'])){
		$site_info['langs'] = array($language=>true);
		//保存入数据库
		$site_mod = new SiteModel();
		$site_mod->update_by_key_site_limit(SITE_ID, array('langs'=>$site_info['langs']));
		//同时更新缓存
		$cache = get_cache_service();
		$site_cache_key = DOMAIN . '_' . CACHE_KEY;
		$cache->set($site_cache_key, $site_info);
	}
}

/**
 * 初始化Controller
 */
function init_controller_action(){
	if(isset($_REQUEST['app'])){
		$app = trim($_REQUEST['app']);
	}else{
		$app = 'site';
	}

	if(isset($_REQUEST['act'])){
		$act = trim($_REQUEST['act']);
	}else{
		$act = 'index';
	}
	if($app === 'url' && $act!=='reflash'){
		//如果是url转向的，则直接定向到对应的Controller
		$path = '/' . $_REQUEST['path'];
		$cache = get_cache_service();
		$result = $cache->get($path);
		if($result == false){
			$url_mod = new UrlModel();
			$urls = $url_mod->get_by_attrs(array('items.url'=>$path));
			if(empty($urls)){
				header('Location: /404.html');
				exit;
			}
			foreach ($urls['items'] as $r){
				$cache->set($r['url'], $r);
				if($r['url'] == $path){
					$result = $r;
				}
			}
		}
		$_REQUEST['id'] = $result['id'];
		define('APP', $result['app']);
		define('ACT', $result['act']);
	}else{
		define('APP', $app);
		define('ACT', $act);
	}
}

/**
 * 获取终端 类别：web/wap/pad/spider...
 */
function get_agent_type(){
	if(isset($_SERVER['HTTP_USER_AGENT'])){
		$user_agent = strtolower($_SERVER['HTTP_USER_AGENT']);
		
		$spiders = array(
			'Googlebot', 	// Google 爬虫
			'Baiduspider', 	// 百度爬虫
			'Sosospider',  	// SoSo爬虫
			'Yahoo! Slurp', // 雅虎爬虫
			'YodaoBot', 	// 有道爬虫
			'msnbot', 		// Bing爬虫
			'Shockwave Flash', //Flash上传
		);
		foreach ($spiders as $spider) {
			$spider = strtolower($spider);
			if(strpos($user_agent,$spider)>-1){
				//爬虫
				define('IS_SPIDER', true);
				return 'spider';
			}
		}
		
		if(!starts_with($user_agent,"mozilla")){ 
			// user_agent不以“Mozilla”开头的，全部打开wap网站
			return 'wap';
		}else if(strpos($user_agent,"symbianos")>-1 || strpos($user_agent,"midp")>-1 || strpos($user_agent,"android")>-1 || strpos($user_agent,"opera")>-1 || strpos($user_agent,"iphone")>-1) {
			// user_agent以“Mozilla”开头的，但包含“SymbianOS”、“MIDP”和“Opera”的，还是打开wap网站
			return 'wap';
		} else { 
			return 'web';
		}
	}else{
		if(!isset($_SERVER['HTTP_ACCEPT_CHARSET']) || $_SERVER['HTTP_ACCEPT_CHARSET']==null)
			return 'web';
		else 
			return 'wap';
	}
}

/**
 * 判断字符串是否以指定的串开始
 * @param $haystack
 * @param $start_str
 * @param $case
 */
function starts_with($haystack, $start_str, $case=true) {
	if($case){
		return (strcmp(substr($haystack, 0, strlen($start_str)),$start_str)===0);
	}
	return (strcasecmp(substr($haystack, 0, strlen($start_str)),$start_str)===0);
}

/**
 * 获取缓存句柄
 */
function &get_cache_service(){
	global $cache_service;
	if($cache_service == null){
		require_once ROOT_PATH.'/protected/includes/cache/MemcachedCache.php';
		$cache_service = new MemcachedCache;
	}
	return $cache_service;
}

/**
 * 打印调试信息
 * @param $msg
 */
function logger_debug($msg){
	echo $msg;
}

/**
 * 打印错误信息
 * Enter description here ...
 * @param $msg
 * @param $site_id，如果$site_id大于0，将同时记录进网站错误日志
 */
function logger_error($msg, $site_id = 0){
	echo $msg;
}

/**
 * 打印警告信息
 * @param unknown_type $msg
 */
function logger_warn($msg){
	echo $msg;
}

/**
 * 自动加载类名
 * @param $class_name
 */
function class_auto_load($class_name){
	$class_name .= '.php';
	return @include_once $class_name;
}

/**
 * 创建GUID
 */
function gen_guid(){
	if (function_exists('com_create_guid')){
		$guid = com_create_guid();
		$guid = substr($guid, 1, strlen($guid)-2);
		$guid = preg_replace('/-/i', '', $guid);
		return $guid;
	}else{
		mt_srand((double)microtime()*10000);//optional for php 4.2.0 and up.
		$charid = strtoupper(md5(uniqid(rand(), true)));
		$uuid = substr($charid, 0, 8)
			.substr($charid, 8, 4)
			.substr($charid,12, 4)
			.substr($charid,16, 4)
			.substr($charid,20,12);
		return $uuid;
   }
}

    
/**
 * 获得一个Model对象
 * @param $model_name
 */
function &m($model_name){
    $model_name = ucfirst($model_name) . 'Model';
    $mod = new $model_name;
    return $mod;
}

/**
 * 创建目录
 * @param string $absolute_path
 * @param int $mode
 */
function yu_mkdirs($absolute_path){
	if(!file_exists($absolute_path)){
		yu_mkdirs(dirname($absolute_path));
		return mkdir($absolute_path);
	}
	return true;
}

/**
 * 删除某个目录及目录内所有文件、子目录
 * @param unknown_type $path
 */
function yu_del_dir($dir){
	if(!$handle=@opendir($dir)){     //检测要打开目录是否存在
		return false;
	}
	while(false !==($file=readdir($handle))){
		if($file!=="."&&$file!==".."){       //排除当前目录与父级目录
			$file=$dir .DIRECTORY_SEPARATOR. $file;
			if(is_dir($file)){
				if(!yu_del_dir($file)){
					return false;
				}
			}else{
				if(!@unlink($file)){
					return false;
				}
			}
		}
	}
	if(!@rmdir($dir)){
		return false;
	}
	closedir($handle);
	return true;
}

/**
 * 写入文件，如果文件不存在，则创建，写入前一定要保存目录已经存在
 * @param unknown_type $file_path 文件路径 
 * @param unknown_type $content 文件内容
 */
function write($file_path, $content){
	$handle = @fopen($file_path, 'w');
	@fwrite($handle, $content);
	fclose($handle);
	@chmod($file_path, 0666);
}

/**
 * 动态执行
 * @param string $content 要解析的内容
 * @param YSmarty $parent_smarty 传入页面使用的smarty对象，
 * 		可以将页面上的变量全部转移过来，即是可以使用已经assign过的变量
 * @param Array $vars 变量，需要assign到Smarty实例内的变量
 *  	注意：在页面上assign过的变量不需要重新assign
 */
function eval_content($content, $parent_smarty=NULL, $vars=null){
	$smarty = Viewer::get_view();
	if($parent_smarty !== NULL){
		$smarty->tpl_vars = $parent_smarty->tpl_vars;
	}
	if($vars!=null){
		foreach ($vars as $key => $val){
			$smarty->assign2($key, $val);
		}
	}
	return $smarty->compile($content);
}

//------------Session操作
/**
 * 初始化Session
 */
function _session_start(){
	global $session_key, $session;
	if(empty($_COOKIE['SESSION_ID'])){
		$session_key ='SESSION_ID_' . gen_guid();
		$session = array();
	}else{
		$session_key = $_COOKIE['SESSION_ID']; 
		$cache = get_cache_service();
		$session = $cache->get($session_key);
		if ($session == null ){
			$session = array();
		}
	}
	//重设Cookies以防止过期
	setcookie('SESSION_ID', $session_key , time() + SESSION_EXPIRE, '/');
	register_shutdown_function("_session_save_handler"); 
}

/**
 * Session退出时保存记录
 */
function _session_save_handler(){
	global $session_key, $session;
	$cache = get_cache_service();
	if(empty($session))
		$session = array();
	$cache->set($session_key, $session, SESSION_EXPIRE);
}

/**
 * 获取Session值
 * @param $session_name Session名称
 */
function get_session($session_name){
	global $session;
	if(array_key_exists($session_name, $session))
		return $session[$session_name];
	else
		return null;
}

/**
 * 设置Session
 * @param string $key Session Name
 * @param object $value Session值
 */
function set_session($key, $value){
	global $session;
	$session[$key] = $value;
	
}

/**
 * 删除Session
 */
function remove_session(){
	global $session_key,$session;
	if(!empty($session_key)){
		//删除Cookies
		setcookie('SESSION_ID', NULL);
	}
	$session = array();
}

/**
 * 计算UTF8的字符长度
 * @param $string
 */
function utf8_strlen($string=null) {
	// 将字符串分解为单元
	preg_match_all('/./us', $string, $match);
	// 返回单元个数
	return count($match[0]);
}

function cut_str($sourcestr,$cutlength){
	$returnstr='';
	$i=0;
	$n=0;
	$str_length=strlen($sourcestr);//字符串的字节数
	while (($n<$cutlength) and ($i<=$str_length))
	{
		$temp_str=substr($sourcestr,$i,1);
		$ascnum=Ord($temp_str);//得到字符串中第$i位字符的ascii码
		if ($ascnum>=224)    //如果ASCII位高与224，
		{
			$returnstr=$returnstr.substr($sourcestr,$i,3); //根据UTF-8编码规范，将3个连续的字符计为单个字符
			$i=$i+3;            //实际Byte计为3
			$n++;            //字串长度计1
		}
		elseif ($ascnum>=192) //如果ASCII位高与192，
		{
			$returnstr=$returnstr.substr($sourcestr,$i,2); //根据UTF-8编码规范，将2个连续的字符计为单个字符
			$i=$i+2;            //实际Byte计为2
			$n++;            //字串长度计1
		}
		elseif ($ascnum>=65 && $ascnum<=90) //如果是大写字母，
		{
			$returnstr=$returnstr.substr($sourcestr,$i,1);
			$i=$i+1;            //实际的Byte数仍计1个
			$n++;            //但考虑整体美观，大写字母计成一个高位字符
		}
		else                //其他情况下，包括小写字母和半角标点符号，
		{
			$returnstr=$returnstr.substr($sourcestr,$i,1);
			$i=$i+1;            //实际的Byte数计1个
			$n=$n+0.5;        //小写字母和半角标点等与半个高位字符宽...
		}
	}
	if ($str_length>$cutlength){
		$returnstr .= '...';//超过长度时在尾处加上省略号
	}
	return $returnstr;

}

function sub_str($string, $length = 0, $append = true){
    if(strlen($string) <= $length) {
        return $string;
    }
    $string = str_replace(array('&amp;', '&quot;', '&lt;', '&gt;'), array('&', '"', '<', '>'), $string);
    $strcut = '';
    if(strtolower(CHARSET) == 'utf-8') {
        $n = $tn = $noc = 0;
        while($n < strlen($string)) {
            $t = ord($string[$n]);
            if($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) {
                $tn = 1; $n++; $noc++;
            } elseif(194 <= $t && $t <= 223) {
                $tn = 2; $n += 2; $noc += 2;
            } elseif(224 <= $t && $t < 239) {
                $tn = 3; $n += 3; $noc += 2;
            } elseif(240 <= $t && $t <= 247) {
                $tn = 4; $n += 4; $noc += 2;
            } elseif(248 <= $t && $t <= 251) {
                $tn = 5; $n += 5; $noc += 2;
            } elseif($t == 252 || $t == 253) {
                $tn = 6; $n += 6; $noc += 2;
            } else {
                $n++;
            }
            if($noc >= $length) {
                break;
            }
        }
        if($noc > $length) {
            $n -= $tn;
        }
        $strcut = substr($string, 0, $n);
    }else{
        for($i = 0; $i < $length; $i++) {
            $strcut .= ord($string[$i]) > 127 ? $string[$i].$string[++$i] : $string[$i];
        }
    }
    $strcut = str_replace(array('&', '"', '<', '>'), array('&amp;', '&quot;', '&lt;', '&gt;'), $strcut);
    if ($append && $string != $strcut){
        $strcut .= '...';
    }
    return $strcut;
}
	
/**
 * 上传图片
 * @param $upload_path 上传图片的保存目录，不包含ROOT_PATH，后面以/结尾
 * @param $form_name 表单的名称
 * @param $new_file_name 新文件名，如果为空，则直接使用gen_guid()代替
 */
function upload_img($upload_path, $form_name='picture', $new_file_name=null){
    $file_path = '';
	if (empty($_FILES) !== false){
		return array('result'=>false, 'info'=>'no_upload_file');
	}
	if(!$_FILES [$form_name]['name']){
		return array('result'=>false, 'info'=>'no_file_selected');
	}
	$file_size = $_FILES[$form_name]['size'];
	if($file_size > MAX_UPLOAD_SIZE * 1000000){
		return array('result'=>false, 'info'=>'upload_file_too_big');
	}
	//允许上传的文件类型
	$allow_file_postfixs = array('.jpg', '.png', '.gif', '.jpeg');
	
	$temp_file_name = $_FILES[$form_name]['name'];
	$file_postfix = get_file_ext($temp_file_name);
	if($file_postfix==='' || !in_array($file_postfix, $allow_file_postfixs)){
		//不允许上传类型
		return array('result'=>false, 'info'=> 'unallow_upload_img_type');
	}
	if(!file_exists(ROOT_PATH . '/' . $upload_path)){
		//新建目录
		if(!yu_mkdirs(ROOT_PATH . '/' . $upload_path)){
			return array('result'=>false, 'info'=> 'create_dir_fail');
		}
	}
	if(@is_writable(ROOT_PATH . '/' . $upload_path)===false) {
		//不允许写入
		return array('result'=>false, 'info'=> 'dir_is_unwritable');
	}
	if($new_file_name == null){
		$new_file_name = gen_guid();
	}
		
	$new_path = $upload_path . $new_file_name . $file_postfix;
	if (move_uploaded_file($_FILES [$form_name]['tmp_name'], ROOT_PATH . '/' . $new_path)){
		//写入数据库
		$file_mod = new FileModel();
		$f_id = gen_guid();
		$file_data = array(
			'_id' 		=> $f_id,
			'site_id' 	=> SITE_ID,
			'name' 		=> $new_file_name,	//文件名，不包含后缀
			'postfix' 	=> $file_postfix,	//文件后缀
			'size' 		=> $file_size,		//文件大小
			'path' 		=> '/' . $new_path,	//文件路径，不包含ROOT_PATH部分
			'time' 		=> time(),			//创建时间
			'type'		=> 1,				//文件类型， 1:图片 2:Flash 3:视频
		);
		$file_mod->insert($file_data);
		return array(
			'result'=>true, 
			'info'=>Lang::get('file_upload_success'), 
			'path' => '/' . $new_path, 
			'data'=>CACHE_URL . '/' . $new_path, 
			'file_id'=>$f_id
		);
	}else{
		return array('result'=>false, 'info'=>Lang::get('save_file_fail'));
	}
}

/**
 * 获取文件后缀名，会返回一个小写的文件后缀，带点
 * @param unknown_type $file_name 文件名或路径 
 */
function get_file_ext($file_name){
	$index =  strrpos($file_name, ".");
	if($index===false){
		return '';
	}
	return strtolower(substr($file_name, $index));
}

/**
 * 通过标准的权限表单（acl_list.html）提交上来的数据进行封装
 * 并返回可以直接保存进数据库的值:
 * array('crm'=>12, 'account'=>3 ...);
 */
function get_acl_array($acl_mod=null){
	if($acl_mod == null)
		$acl_mod = new AclModel();
	$namespace_info = $acl_mod->find(array('sys'=>SYSTEM), 'name');
	$acls = array();
	foreach($namespace_info as $namespace=>$value){
		if(isset($_POST[$namespace])){
			$acls[$namespace] = $_POST[$namespace];
		}
	}
	$acl_array = ACLHelper::parse_acl_array($acls);
	return $acl_array;
}

function get_thumb_path($path, $thumb){
	$path = preg_replace('%(.*)/([^/]+.(jpg|jpeg|gif|png))%i', '$1/' . $thumb . '/$2', $path);
	return $path;
}

/**
 * 将语言包的数据提取到上层并删除原语言包
 * 比如：array('id'=>123, 'zh_cn'=>array('name'=>'中文名'))执行后将变为：array('id'=>123, 'name'=>'中文名')
 * @param unknown_type $data_array
 * @param unknown_type $lang
 */
function lang_fatch(&$data_array, $lang, $remove_lan=true, $remove_other_lan=false){
	if(empty($data_array))return $data_array;
	if(!is_array($data_array)) return $data_array;
	foreach($data_array as $key=>$val){
		if($key === $lang){
			foreach($data_array[$lang] as $key=>$val){
				$data_array[$key] = lang_fatch($val, $lang, $remove_lan);
			}
		}elseif(is_array($val)){
			$data_array[$key] = lang_fatch($val, $lang, $remove_lan);
		}
	}
	
	if(isset($data_array[$lang])){
		if($remove_lan){
			unset($data_array[$lang]);
		}
	}
	return $data_array;
}

/**
 * 使用CRYPT算法加密
 * @param string $input 要加密的字段
 * @param string $key 加密密钥
 */
function encrypt($input, $key=null){
	if($key == null)$key = FINGERPRINT;
	$input = str_replace("\n", '', $input);
	$input = str_replace("\t", '', $input);
	$input = str_replace("\r", '', $input);
	$key = substr(md5($key), 0, 24);
	$td = mcrypt_module_open('tripledes', '', 'ecb', '');
	$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
	mcrypt_generic_init($td, $key, $iv);
	$encrypted_data = mcrypt_generic($td, $input);
	mcrypt_generic_deinit($td);
	mcrypt_module_close($td);
	return trim(chop(base64_encode($encrypted_data)));
}

/**
 * 使用CRYPT算法解密某加密字段
 * @param string $input 要解密的字段
 * @param string $key 解密使用的密钥
 */    
function decrypt($input, $key=null){
	if($key == null)$key = FINGERPRINT;
	$input = str_replace("\n", '', $input);
	$input = str_replace("\t", '', $input);
	$input = str_replace("\r", '', $input);
	$input = trim(chop(base64_decode($input)));
	$td = mcrypt_module_open('tripledes', '', 'ecb', '');
	$key = substr(md5($key), 0, 24);
	$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
	mcrypt_generic_init($td, $key, $iv);
	$decrypted_data = mdecrypt_generic($td, $input);
	mcrypt_generic_deinit($td);
	mcrypt_module_close($td);
	return trim(chop($decrypted_data));
} 

/**
 * 用户自定义排序，根据rank值排序，如果不存在rank键，则返回false
 * @param unknown_type $item1
 * @param unknown_type $item2
 */
function sort_by_rank(&$data_array, $key_save=true, $key_name='_id'){
	if($key_save){
		foreach($data_array as $k=>$v){
			$data_array[$k][$key_name] = $k;
		}
	}
	usort($data_array, 'sort_by_rank_fun');
}

function sort_by_rank_fun($item1, $item2){
	if(!isset($item1['rank']))
		$r1 = 10000;
	else 
		$r1 = intval($item1['rank']);
	
	if(!isset($item2['rank']))
		$r2 = 10000;
	else 
		$r2 = intval($item2['rank']);
	if($r1 == $r2) return 0;
	if($r1 > $r2)
		return 1;
	else 
		return -1; 
}

function validate_email($email){
	$is_valid = true;
	$at_index = strrpos($email, "@");
	if (is_bool($at_index) && !$at_index){
		$is_valid = false;
	}else{
		$domain = substr($email, $at_index+1);
		$local = substr($email, 0, $at_index);
		$local_len = strlen($local);
		$domain_len = strlen($domain);
		if ($local_len < 1 || $local_len > 64){
			// local part length exceeded
			$is_valid = false;
		}else if ($domain_len < 1 || $domain_len > 255){
			// domain part length exceeded
			$is_valid = false;
		}else if ($local[0] == '.' || $local[$local_len-1] == '.'){
			// local part starts or ends with '.'
			$is_valid = false;
		}else if (preg_match('/\\.\\./', $local)){
			// local part has two consecutive dots
			$is_valid = false;
		}else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain)){
			// character not valid in domain part
			$is_valid = false;
		}else if (preg_match('/\\.\\./', $domain)){
			// domain part has two consecutive dots
			$is_valid = false;
		}else if(!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/',str_replace("\\\\","",$local))){
			// character not valid in local part unless
			// local part is quoted
			if (!preg_match('/^"(\\\\"|[^"])+"$/',str_replace("\\\\","",$local))){
				$is_valid = false;
			}
		}
		// 		if ($isValid && !(checkdnsrr($domain,"MX") || checkdnsrr($domain,"A")))
			// 		{
			// 			// domain not found in DNS
			// 			$isValid = false;
			// 		}
	}
	return $is_valid;
}


/**
 * 初始化文章链接
 * @param article 文章 
 * @param url
 */
function init_article_url(&$article, $url) {
	if(isset($article['alias']) && !empty($article['alias'])){
		$article['url'] = $url . '/' . $article['alias'] . '.html';
	}else{
		$article['url'] = $url . '/' . $article['_id'] . '.html';
	}
	return $article;
}